// 控制页面路由跳转
// 导入路由对象
import router from '@/router/index'
import store from '@/store'

// 导入NProgress进度条
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式
// 开启进度条效果:NProgress.start()
// 关闭进度条效果:NProgress.done()

// 白名单:没有token值但是又可以访问的页面的路径
const whiteList = ['/login', '/404']
// 设置路由前置守卫
// to :去哪
// from :从那个组件来
// next :函数  next()放行  next(false)不跳
router.beforeEach(async(to, from, next) => {
  NProgress.start() // 开启进度条
  // 判断是否有token,js文件不是组件不能直接用 this
  // 获取token
  const token = store.getters.token
  //   判断是否有token
  if (token) {
    //  如果有token
    if (token) {
      //  判断token值是否等于登录页面,有token值代表已经登录过了
    //   当路径再等于login的时候直接让跳转到主页
      if (to.path === '/login') {
        next('/')
        NProgress.done() // 当跳转到主页的时候也可以关闭进度条
      } else {
        //  token一通过立马发送axios获取初始化用户信息
        //  this.$store.dispatch('模块名/方法名')
        if (!store.state.user.userInfo.userId) {
          const { roles: { menus }} = await store.dispatch('user/getUserInfo') // 调用axios
          // 同步代码会按照代码顺序执行,利用await
          console.log(menus)

          // 1,根据menus筛选出对应的路由
          // 2,把筛选的路由再添加到路由规则中 :router.addRoutes([{path:xxx,component:xxx},{},{},...])
          // 建议修改路由的业务逻辑放在vuex中

          // console.log(router)
          // 3,临时添加所有的动态路由,测试router.addRoutes()
          // router.addRoutes(asyncRoutes)// 动态添加路由是异步的
          const otherRoutes = await store.dispatch('permission/filterRoutes', menus)
          // 动态新增路由
          router.addRoutes([...otherRoutes, { path: '*', redirect: '/404', hidden: true }])

          next({
            // path: to.path,
            ...to,
            replace: true // 重进一次,不保留重复历史,固定写法
          })
        }
        //   如果不是登录页就放行
        next()
      }
    }
  } else {
    // 没有token 判断路径是否存在白名单 includes():判断字符串是否包含指定的子字符串
    // whiteList.includes(to.path):要跳转的页面的路径是否存在whiteList数组中包含的路径
    if (whiteList.includes(to.path)) {
      // 存在白名单就放行
      next()
    } else {
      // 不存在白名单就去登录页
      next('/login')
      NProgress.done()
    }
  }
})

// 设置路由后置守卫
router.afterEach((to, from) => {
  // setTimeout(function() {
  //   关闭进度条
  NProgress.done()
  // }, 3000)
})
